$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Још неки примери

Нудимо вам и пар додатних примера који могу да буду интересантни за проучавање, играње, или као полазне идеје за ваше пројекте.

У овој лекцији неће бити нових ствари које треба научити, али то (наравно) не значи да смо научили све. Као што и наслов приручника каже, све што смо до сада прешли треба посматрати као увод и основу за даље стицање знања и вештина.

Палачинке

На левој страни се налазе правоугаоници различите величине, један на другом. Кликом на дугме > пребацујемо највиши правоугаоник на врх десне гомиле (која је на почетку празна). Кликом на дугме << пребацујемо целу десну гомилу на врх леве стране. Циљ је да се на левој страни појаве правоугаоници сложени по величини (највећи доле, најмањи горе).

../_images/interact_pancakes.gif

Користићемо два оквира за слику, један прислоњен уз леву, а други уз десну ивицу прозора. У средњем делу прозора поставћемо четири дугмета. Два од њих су описана у поставци задатка и потребна су за само играње игре, а остала два дугмета ће служити за ресетовање текуће игре (играње од почетка), односно за почињање нове игре. Изнад дугмади пстављамо лабелу која показује број одиграних потеза, а испод дугмади лабелу која приказује поруку честитања после успешно одигране игре.

Овај пример је посебан по томе што у њему нисмо обрађивали догађаје миша или тастатуре, корисник игра игру само кликовима на дугмад. Такође, ово нам је једини пример у коме користимо два ковира за слику. Тиме смо постигли да помоћу исте функције (NacrtajPalacinke) цртамо правоугаонике и на једној и на другој страни. Избегавањем редунданце (понављања делова програма) код постаје лакши за одржавање. То значи да је олакшано мењање програма, било да је реч о исправљању грешака, или уграђивању нових идеја, односно захтева.

Иако је програм релативно дугачак, свака од функција је довољно кратка и једноставна да више не би требало да вам буде проблем да их разумете и без објашњења.

using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace Palacinke
{
    public partial class Form1 : Form
    {
        const int BrojPalacinki = 10;
        List<int> PocetnaLista = new List<int>();
        List<int> LevaLista = new List<int>();
        List<int> DesnaLista = new List<int>();
        int BrojKlikova = 0;
        Random Rnd = new Random();

        public Form1()
        {
            InitializeComponent();
            Text = "Palačinke";
            BackColor = Color.FromArgb(23, 187, 156);
            pictureBox1.BackColor = Color.FromArgb(23, 187, 156);
            pictureBox2.BackColor = Color.FromArgb(23, 187, 156);
            btnJednuDesno.Enabled = false;
            btnSveLevo.Enabled = false;
            btnIspocetka.Enabled = false;
        }

        private void NacrtajPalacinke(PictureBox pb, List<int> palacinke, PaintEventArgs e)
        {
            int d = 16;
            int y = pb.Height - 3 * d;
            Graphics g = e.Graphics;
            Brush cetka = new SolidBrush(Color.Yellow);

            foreach (int n in palacinke)
            {
                int x = (pb.Width - n * d) / 2;
                g.FillRectangle(cetka, x, y, n * d, d);
                y -= d;
            }
        }

        private void btnNova_Click(object sender, EventArgs e)
        {
            PocetnaLista.Clear();
            LevaLista.Clear();
            DesnaLista.Clear();

            for (int i = 0; i < BrojPalacinki; i++)
                PocetnaLista.Add(i + 1);

            PocetnaLista = PocetnaLista.OrderBy(a => Rnd.Next()).ToList(); // Promesaj
            LevaLista.AddRange(PocetnaLista);
            btnJednuDesno.Enabled = true;
            btnSveLevo.Enabled = true;
            btnIspocetka.Enabled = true;
            BrojKlikova = 0;
            lblBrojKlikova.Text = BrojKlikova.ToString();
            lblCestitka.Text = "";
            Invalidate();
        }

        private void btnIspocetka_Click(object sender, EventArgs e)
        {
            LevaLista.Clear();
            DesnaLista.Clear();

            LevaLista.AddRange(PocetnaLista);
            btnJednuDesno.Enabled = true;
            btnSveLevo.Enabled = true;
            BrojKlikova = 0;
            lblBrojKlikova.Text = BrojKlikova.ToString();
            lblCestitka.Text = "";
            Invalidate();
        }

        private void btnJednuDesno_Click(object sender, EventArgs e)
        {
            if (LevaLista.Count > 0)
            {
                BrojKlikova++;
                lblBrojKlikova.Text = BrojKlikova.ToString();

                DesnaLista.Add(LevaLista.Last());
                LevaLista.RemoveAt(LevaLista.Count - 1);
                Invalidate();
            }
        }

        private void btnSveLevo_Click(object sender, EventArgs e)
        {
            if (DesnaLista.Count > 0)
            {
                BrojKlikova++;
                lblBrojKlikova.Text = BrojKlikova.ToString();

                LevaLista.AddRange(DesnaLista);
                DesnaLista.Clear();

                bool opadajuci = true;
                for (int i = 1; i < LevaLista.Count; i++)
                {
                    if (LevaLista[i] > LevaLista[i - 1])
                    {
                        opadajuci = false;
                        break;
                    }
                }

                if (opadajuci)
                {
                    btnJednuDesno.Enabled = false;
                    btnSveLevo.Enabled = false;
                    lblCestitka.Text = "Bravo!";
                }
                Invalidate();
            }
        }

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            NacrtajPalacinke(pictureBox1, LevaLista, e);
        }

        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            NacrtajPalacinke(pictureBox2, DesnaLista, e);
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            pictureBox1.Invalidate();
            pictureBox2.Invalidate();
        }
    }
}

Вешала

Ово је још једна стара и некад врло популарна игра. Један играч задаје реч док други не гледа, а затим други погађа слова задате речи, док не погоди сва слова или не погреши превише пута.

../_images/interact_Hangman.png

Користићемо следеће контроле:

  • Дугме btnNovaIgra, којим се покреће нова игра;

  • Текстуално поље txtPojam, у коме први играч задаје реч;

  • Дугме btnKrajUnosa, којим први играч саопштава програму да је завршио задавање речи;

  • Лабела lblPolupogodjeno садржи део речи који је други играч погодио;

  • Лабела lblPromasaji, која садржи неуспеле покушаје другог играча да погоди слова задате речи;

  • Лабела lblPromasajiTekst садржи реч „Promašaji”;

  • Лабела lblUputstvo, у којој се појављује текст, који појашњава играчима шта треба да раде. Овај текст се мења у току рада програма, могуће вредности су „Pogađač neka ne gleda, zadavač neka unese pojam” (упутство првом играчу на почетку нове игре), „Pogađajte pojam” (упутство другом играчу), „😀” (када други играч погоди реч), и „🙁” (када други играч не успе да погоди реч).

Пошто није могуће мењати појединачна слова стринга, да би програм био једноставнији и ефикаснији, за полупогођен појам и списак слова-промашаја уместо стрингова користимо низове карактера (char[] PolupogodjenPojam; char[] Promasaji;), па их након сваког ажурирања конвертујемо у стрингове ради приказивања.

У објашњавање самог кода се нећемо упуштати, верујемо да ћете и самостално успети да разумете све детаље.

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Vesala
{
    public partial class Form1 : Form
    {
        const int UKUPNO_POKUSAJA = 6;
        char[] PolupogodjenPojam;
        char[] Promasaji;
        bool PogadjanjeJeUToku = false;
        int PreostaloPokusaja;

        public Form1()
        {
            InitializeComponent();
            ClientSize = new Size(600, 250);
            Text = "Vešala";
            BackColor = Color.FromArgb(23, 187, 156);
            NovaIgra();
        }

        private void NovaIgra()
        {
            txtPojam.Visible = true;
            btnKrajUnosa.Visible = true;
            btnNovaIgra.Visible = false;
            lblPromasajiTekst.Visible = false;
            lblPromasaji.Visible = false;
            lblPolupogodjeno.Visible = false;
            lblUputstvo.Text = "Pogađač neka ne gleda, zadavač neka unese pojam";
            txtPojam.Text = "";
            PreostaloPokusaja = UKUPNO_POKUSAJA;
            PogadjanjeJeUToku = false;
            txtPojam.Focus();
        }

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!PogadjanjeJeUToku)
                return;

            char pokusaj = Char.ToUpper(e.KeyChar);
            foreach (var stariPromasaj in Promasaji)
                if (pokusaj == stariPromasaj)
                    return; // ovo slovo je vec pokusano

            bool nadjeno = false;
            for (int i = 0; i < txtPojam.Text.Length; i++)
                if (txtPojam.Text[i] == pokusaj)
                {
                    PolupogodjenPojam[i] = pokusaj;
                    nadjeno = true;
                }

            if (nadjeno)
            {
                lblPolupogodjeno.Text = new string(PolupogodjenPojam);
                if (lblPolupogodjeno.Text == txtPojam.Text)
                {
                    PogadjanjeJeUToku = false;
                    lblUputstvo.Text = "😀"; // uspesan kraj
                }
            }
            else
            {
                Promasaji[UKUPNO_POKUSAJA - PreostaloPokusaja] = pokusaj;
                PreostaloPokusaja--; // pogadjac gubi jedan zivot
                lblPromasaji.Text = new string(Promasaji);
                if (PreostaloPokusaja == 0)
                {
                    PogadjanjeJeUToku = false;
                    lblUputstvo.Text = "🙁"; // Neuspesan kraj
                }
            }
        }

        private void btnNovaIgra_Click(object sender, EventArgs e)
        {
            NovaIgra();
        }

        private void btnKrajUnosa_Click(object sender, EventArgs e)
        {
            txtPojam.Visible = false;
            btnKrajUnosa.Visible = false;
            btnNovaIgra.Visible = true;
            lblPromasajiTekst.Visible = true;
            lblPromasaji.Visible = true;
            lblPolupogodjeno.Visible = true;
            lblUputstvo.Text = "Pogađajte pojam";
            lblPromasaji.Text = new string('.', UKUPNO_POKUSAJA);

            Promasaji = lblPromasaji.Text.ToCharArray();
            txtPojam.Text = txtPojam.Text.ToUpper();
            PolupogodjenPojam = new char[txtPojam.Text.Length];
            for (int i = 0; i < txtPojam.Text.Length; i++)
                PolupogodjenPojam[i] = txtPojam.Text[i] == ' ' ? ' ' : '-';

            lblPolupogodjeno.Text = new string(PolupogodjenPojam);
            PogadjanjeJeUToku = true;
        }
    }
}

Овим смо завршили наше путовање кроз Приручник. Надамо се да сте нешто научили, да вам је било занимљиво и да имате гомилу идеја за програме и жељу да те програме напишете. Још једном вам желимо забавно и успешно програмирање!